package errors

import (
	"errors"
	"fmt"
)


type Error struct {
	Code int
	Message string
}
func (e *Error) Error() string {
	return fmt.Sprintf("error: code = %d, message = %s ", e.Code, e.Message)
}
func New(code int, message string) * Error {
	return &Error{
		Code:    code,
		Message: message,
	}
}
func Errorf(code int, format string, a ...interface{}) error {
	return New(code, fmt.Sprintf(format, a...))
}
func Code(err error) int32 {
	if err == nil {
		return 0
	}
	if se := FromError(err); err != nil {
		return int32(se.Code)
	}
	return UNKOWNCODE
}
func Message(err error) string {
	if err == nil {
		return ""
	}
	if se := FromError(err); err != nil {
		return se.Message
	}
	return ""
}
func FromError(err error) *Error {
	if err == nil {
		return nil
	}
	if e := new(Error); errors.As(err,&e) {
		return e
	}
	return New(UNKOWNCODE,err.Error())
}
